package com.fuhao.PublishSubscribe;

import com.fuhao.utils.RabbitUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 *                                      |-----C1
 *                       |----- Q1------|
 *                       |              |-----C2
 *     P-----Exange------|
 *                       |              |-----C1
 *                       |----- Q2------|
 *                                      |-----C2
 * ravbit模型之发布订阅模型
 *          1.生产者生产消息发给路由器（Exchange），然后经过路由器到达消息队列
 *          2.每一个消费者都有自己的队列（多个消费者可如work模型一样同对列）
 *          3.每个队列绑定到Exchange中
 * @author zhang
 */
public class Product {
    public static void main(String[] args) throws IOException, TimeoutException {
        Connection connection = RabbitUtils.getConnection();
        Channel channel = connection.createChannel();
        //此处创建路由器,第一个参数 路由器名称，
        // 第二个参数 路由器类型：
        //fanout：会忽视绑定键，每个消费者都可以接受到所有的消息（前提是每个消费者都要有各自单独的队列，而不是共有同一队列）。
        //direct：只有绑定键和路由键完全匹配时，才可以接受到消息。
        //topic：可以设置多个关键词作为路由键，在绑定键中可以使用*和#来匹配
        channel.exchangeDeclare("exchange_fanout","fanout");

        String msg = "exchange fanout queue";
        //发送消息发到路由器中,fanout类型不用指定第二个参数，相当于路由键
        channel.basicPublish("exchange_fanout","",null,msg.getBytes());
        System.out.println("发送信息："+msg);

        channel.close();
        connection.close();
    }
}
